package talayaco.manager;

import java.util.Date;
import java.util.List;
import java.util.Map;

import talayaco.vo.DiagnosticoGeneralVO;
import talayaco.vo.ReporteAnimalVO;
import talayaco.vo.ReporteRecriaVO;

public interface GestionAnimalesMAN {

	/**
	 * Persiste un animal en la base de datos
	 * 
	 * @param datos
	 *            Datos de los animales
	 * @param nombreProveedor
	 *            Nombre del proveedor
	 * @param unaFecha
	 *            Fecha del ingreso
	 * @throws Exception
	 */
	void insertAnimal(List<Map<String, Object>> datos, String nombreProveedor,
			Date unaFecha) throws Exception;

	/**
	 * Este metodo retorna los datos de un animal a partir de su caravana
	 * 
	 * @param caravana
	 *            caravana del animal
	 * @return mapa con todos los datos del animal
	 */
	Map<String, String> getAnimalByCaravana(String caravana) throws Exception;

	/**
	 * Este metodo determina si un numero de caravana ya esta en uso para otro
	 * 
	 * @param caravana
	 *            caravana animal
	 * @return true si ya existe, false de lo contrario
	 */
	Boolean existeAnimal(String caravana) throws Exception;

	/**
	 * Este metodo determina si un numero de caravana de una animal es un tipo
	 * especifico de animal
	 * 
	 * @param caravana
	 *            Caravana del animal
	 * @param tipo
	 *            Tipo de animl
	 * @return TRUE si existe y FALSE caso contrario
	 * 
	 * @throws Exception
	 */
	Boolean existeAnimalByCaravanaAndTipo(String caravana, String tipo)
			throws Exception;

	/**
	 * Metodo que obtiene los datos de un animal para su modificacion
	 * 
	 * @param caravana
	 *            Caravana del animal
	 * @return Mapa con datos del animal
	 * @throws Exception
	 */
	Map<String, String> getAnimalParaModificacionByCaravana(String caravana)
			throws Exception;

	/**
	 * Metodo que obtiene los datos de un animal para su modificacion
	 * 
	 * @param id
	 *            id del animal
	 * @return Mapa con datos del animal
	 * @throws Exception
	 */
	Map<String, String> getAnimalParaModificacionById(String id)
			throws Exception;

	/**
	 * Metodo que obtiene listado de animales segun el corral
	 * 
	 * @param idCorral
	 *            Id de un corral
	 * @return Listado de mapas con datos de animales
	 * @throws Exception
	 */
	List<Map<String, String>> getAnimalesParaModificacionByCorral(
			String idCorral) throws Exception;

	/**
	 * Metodo que persiste el egreso de animales ya sea por venta o por muerte
	 * 
	 * @param datosEgreso
	 *            Datos del egreso
	 * @throws Exception
	 */
	void updateAnimalEgreso(List<Map<String, Object>> datosEgreso,
			Date fechaEgreso, String nombreCliente, String tipoEgreso)
			throws Exception;

	/**
	 * Metodo que obtiene la cantidad de animales que hay en un corral y que son
	 * de un determinado tipo
	 * 
	 * @param cantidad
	 *            Cantidad de animales
	 * @param tipo
	 *            Tipo de animal
	 * @param idCorral
	 *            Id del corral
	 * @return -1 si no hay tantos en el corral, y sino la cantidad
	 * @throws Exception
	 */
	Integer cantidadAnimalesByTipoyCorral(int cantidad, String tipo,
			String corral) throws Exception;

	/**
	 * Metodo que obtiene la cantidad de animales de un tipo que no pertenecen a
	 * ninugn corral
	 * 
	 * @param cantidad
	 *            Cantidad de animales
	 * @param tipo
	 *            Tipo de animal
	 * @return -1 si no hay tantos animales, y sino la cantidad
	 * @throws Exception
	 */
	Integer cantidadAnimalesByTipoSinCorral(int cantidad, String tipo)
			throws Exception;

	/**
	 * Obtiene lista de animales que se encuentran en un corral
	 * 
	 * @param nombreCorral
	 *            nombre corral
	 * @return lista de caravanas
	 * @throws Exception
	 */
	String[] getNombresByCorralConCaravana(String nombreCorral)
			throws Exception;

	/**
	 * Metodo que obtiene datos de un animal para la funcionalidad de movimiento
	 * de corrales.
	 * 
	 * @param caravana
	 *            Caravana de un animal
	 * @return Mapa con datos de un animal
	 * @throws Exception
	 */
	Map<String, String> getAnimalParaMovimientoByCaravana(String caravana)
			throws Exception;

	/**
	 * Metodo que obtiene datos de un animal para la funcionalidad de generar el
	 * reporte de hoteleria
	 * 
	 * @param caravana
	 *            Caravana de un animal
	 * @return Mapa con datos de un animal
	 * @throws Exception
	 */
	Map<String, String> getDatosValidacion(String caravana) throws Exception;

	/**
	 * Permite la modificacion de un animal a partir de su caravana permitiendo
	 * cambiarle el tipo, la caravana y la observacion
	 * 
	 * @param caravana
	 *            Caravana actual del animal
	 * @param caravanaNueva
	 *            Caravana nueva del animal
	 * @param tipoAnimal
	 *            Tipo de animal
	 * @param observacion
	 *            Observacion del animal
	 * 
	 * @throws Exception
	 */
	void updateAnimalByCarana(String caravana, String caravanaNueva,
			String tipoAnimal, String observacion) throws Exception;

	/**
	 * Permite la modificacion de un animal a partir del corral y su tipo de
	 * animal, permitiendo cambiarle el tipo, la caravana y la observacion
	 * 
	 * @param corral
	 *            Corral actual del animal
	 * @param tipoAnimalOriginal
	 *            Tipo de animal actual
	 * @param caravana
	 *            Caravana nueva para asociarle al animal
	 * @param tipoAnimalNuevo
	 *            Tipo de animal nuevo
	 * @param observacion
	 *            Observacion nueva
	 * 
	 * @throws Exception
	 */
	void updateAnimalById(String id, String caravana, String tipoAnimalNuevo,
			String observacion) throws Exception;

	/**
	 * Metodo que obtiene todos los id de animales que cumplen con una
	 * determinada consulta
	 * 
	 * @param tipoAnimal
	 *            Tipo Animal
	 * @nombreCorral Nombre del corral
	 * @return Lista de id de animales
	 * @throws Exception
	 */
	String[] getIdsAnimales(String tipoAnimal, String nombraCorral)
			throws Exception;

	/**
	 * Metodo que obtiene los datos necesarios para el reporte de animales
	 * 
	 * @param datosConsulta
	 *            Datos para la consulta
	 * @return Lista de vo de reporte animal
	 * @throws Exception
	 */
	List<ReporteAnimalVO> getDatosReporteAnimal(
			Map<String, Object> datosConsulta, Date fechaInicio, Date FechaFin)
			throws Exception;

	/**
	 * Metodo que valida que la fecha de ingreso de animales sea menos a la
	 * fecha pasada como parametro
	 * 
	 * @param idAnimal
	 * @return
	 * @throws Exception
	 */
	String validarFechaIngresoAnimal(String caravana, Date fecha_Desde)
			throws Exception;

	/**
	 * Metodo que obtiene todas las caravanas de animales de un proveedor en
	 * particular.
	 * 
	 * @param nombreProveedor
	 *            Nombre del proveedor
	 * @return
	 * @throws Exception
	 */
	List<String> getCaravanaByProveedor(String nombreProveedor)
			throws Exception;

	/**
	 * Metodo que obtiene todas las caravanas de animales de un cliente en
	 * particular.
	 * 
	 * @param nombreCliente
	 *            Nombre del cliente
	 * @return
	 * @throws Exception
	 */
	List<String> getCaravanaByCliente(String nombreCliente) throws Exception;

	/**
	 * Obtiene el nombre de un proveedor en base a la caravana de uno de sus
	 * animales
	 * 
	 * @param caravana
	 * @return
	 * @throws Exception
	 */
	String getClienteByCaravana(String caravana) throws Exception;

	/**
	 * Metodo que realiza la insercion de una recria
	 * 
	 * @param datos
	 *            Mapa con los datos a insertar
	 * 
	 * @throws Exception
	 */
	void insertRecria(Map<String, Object> datos) throws Exception;

	/**
	 * Busca los datos para el reporte de recria
	 * 
	 * @param datosConsulta
	 *            Datos Consulta
	 * @return Lista de datos para el reportes
	 * 
	 * @throws Exception
	 */
	List<ReporteRecriaVO> getReporteRecria(Map<String, String> datosConsulta)
			throws Exception;

	/**
	 * Controla que una caravana madre no tenga en existencia una cria esecifica
	 * 
	 * @param caravanaMadre
	 * @param caravanaHija
	 * @return Cantidad de relaciones
	 * 
	 * @throws Exception
	 */
	Boolean existeRelacionCriaMadre(String caravanaMadre, String caravanaHija)
			throws Exception;

	/**
	 * Actualiza recria
	 * 
	 * @param datosConsulta
	 * @return
	 * @throws Exception
	 */
	void updateRecria(Map<String, Object> datosConsulta) throws Exception;

	/**
	 * Actualiza recria todos los campos de recria
	 * 
	 * @param datosConsulta
	 * @return
	 * @throws Exception
	 */
	void updateRecriaCompleto(Map<String, Object> datosConsulta)
			throws Exception;

	/**
	 * Obtiene los datos de una recria
	 * 
	 * @param datosConsulta
	 * @return
	 * @throws Exception
	 */
	Map<String, String> getDatosRecria(Map<String, Object> datosConsulta)
			throws Exception;

	/**
	 * Actualiza el valor rodeo de cria de una animal en base a su caravana
	 * 
	 * @param datosConsulta
	 * @throws Exception
	 */
	void updateAnimalRodeoCria(Map<String, Object> datosConsulta)
			throws Exception;

	/**
	 * Guarda el diganostico para un animal.
	 * 
	 * @param datosConsulta
	 * @throws Exception
	 */
	void saveDiagnostico(Map<String, Object> datosConsulta) throws Exception;

	/**
	 * Obtiene el valor de rodeo de cria de un animal
	 * 
	 * @param caravana
	 *            Caravana de un animal
	 * @return
	 * @throws Exception
	 */
	Boolean getRodeoCria(String caravana) throws Exception;

	/**
	 * Abre el reporte de cantidades de diagnosticos
	 * 
	 * @return
	 * @throws Exception
	 */
	List<DiagnosticoGeneralVO> abrirReporteDiagnosticoGeneral()
			throws Exception;

	/**
	 * Obtiene todos los diagnosticos de un animal.
	 * 
	 * @return
	 * @throws Exception
	 */
	List<DiagnosticoGeneralVO> abrirReporteDiagnosticoByCaravana(String caravana)
			throws Exception;

}
